package plus.easydo.data.source.manager.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import plus.easydo.core.base.controller.BaseController;
import plus.easydo.core.exception.ExceptionFactory;
import plus.easydo.core.result.R;
import plus.easydo.data.source.core.DataSource;
import plus.easydo.data.source.core.DataSourceDto;
import plus.easydo.data.source.core.DataSourceManagerService;
import plus.easydo.data.source.core.DataSourceQo;
import plus.easydo.data.source.core.DataSourceVo;
import plus.easydo.data.source.core.HttpDataSourceExecTool;
import plus.easydo.data.source.core.enums.SourceTypeEnum;
import plus.easydo.data.source.manager.mapper.DataSourceManagerMapper;
import plus.easydo.jdbc.utils.JdbcDataSourceExecTool;
import plus.easydo.utils.ResultConvertUtil;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;


/**
 * 数据源管理Service层
 * 
 * @author gebilaoyu
 */
@Service
public class DataSourceManagerServiceImpl extends ServiceImpl<DataSourceManagerMapper, DataSource> implements DataSourceManagerService {


    /**
     * 查询数据源管理
     * 
     * @param id 数据源管理ID
     * @return 数据源管理
     */
    @Override
    public DataSourceVo selectById(String id) {
        DataSource dataSource = baseMapper.selectById(id);
        return ResultConvertUtil.convertVo(dataSource, DataSourceVo::new);
    }

    /**
     * 分页条件查询数据源管理列表
     * 
     * @param qo 查询条件封装
     * @return 数据源管理
     */
    @Override
    public IPage<DataSourceVo> page(DataSourceQo qo) {
        IPage<DataSource> page = qo.startPage();
        IPage<DataSource> iPage = baseMapper.selectDataSourceManagerPage(page, qo);
        List<DataSourceVo> voList = ResultConvertUtil.copyList(iPage.getRecords(), DataSourceVo::new);
        IPage<DataSourceVo> voPage = new Page<>();
        BeanUtils.copyProperties(iPage,voPage);
        voPage.setRecords(voList);
        return voPage;
    }

    /**
     * 获取所有数据源管理列表
     *
     * @param qo 查询条件封装
     * @return 数据源管理
     */
    @Override
    public List<DataSourceVo> list(DataSourceQo qo) {
        List<DataSource> list = baseMapper.selectDataSourceManagerList(qo);
        return ResultConvertUtil.copyList(list, DataSourceVo::new);

    }

    /**
     * 新增数据源管理
     * 
     * @param dto 数据传输对象
     * @return 结果
     */
    @Override
    public int insert(DataSourceDto dto) {
        DataSource dataSource = DataSource.builder().build();
        BeanUtils.copyProperties(dto, dataSource);
        dataSource.buildCreateTime();
        if (dto.getSourceType().equals("HTTP")) {
            if(Objects.nonNull(dto.getParams())){
                dataSource.setParams(dto.getParams().toJSONString());
            }
        }
                return baseMapper.insert(dataSource);
    }

    /**
     * 修改数据源管理
     * 
     * @param dto 数据传输对象
     * @return 结果
     */
    @Override
    public int update(DataSourceDto dto) {
        DataSource dataSource = DataSource.builder().build();
        BeanUtils.copyProperties(dto, dataSource);
        dataSource.buildUpdateTime();
        return baseMapper.updateById(dataSource);
    }

    /**
     * 批量删除数据源管理
     * 
     * @param ids 需要删除的数据源管理ID
     * @return 结果
     */
    @Override
    public Boolean deleteByIds(String[] ids) {
        boolean result = removeByIds(Arrays.asList(ids));
        if (result){
            for(String id: ids){
                JdbcDataSourceExecTool.removeDataSource(id);
            }
        }
        return result;
    }

    /**
     * 删除数据源管理信息
     * 
     * @param id 数据源管理ID
     * @return 结果
     */
    @Override
    public Boolean deleteById(String id) {
        boolean result = removeById(id);
        if(result){
            JdbcDataSourceExecTool.removeDataSource(id);
        }
        return result;
    }

    @Override
    public R<Object> test(DataSourceDto dto) {
        if(dto.getSourceType().equals(SourceTypeEnum.MYSQL.getCode())){
            return BaseController.opResult(JdbcDataSourceExecTool.testDataSource(BeanUtil.beanToMap(dto)));
        }
        if (dto.getSourceType().equals(SourceTypeEnum.HTTP.getCode())){
            return BaseController.ok(HttpDataSourceExecTool.test(dto));
        }
        throw ExceptionFactory.baseException("不支持的数据源");
    }

}
